iT邦幫忙

2022 iThome 鐵人賽

DAY 25
0

條件判斷

在條件判斷中的規範,較常聽見的便是盡量避免否定條件,因為肯定句式會比否定句式更容易理解且直觀。也就是說:

if(employees.isEmpty())

會比下述程式更容易理解,也更好:

if(!employees.isEmpty())

而在提高程式的可讀性上,除了盡量使用肯定的條件判斷,必要時將條件判斷的意圖以函式抽取出來,也是很好的一種方式。因為若未查看上下文,單看判斷條件的內容,通常不容易理解其布林邏輯。

例如:

if(shouldBeDeleted(timer))

會優於:

if(timer.hasExpired() && !timer.isRecurrent())

隱藏時序耦合 (Hidden Temporal Couplings)

關於何謂時序耦合作者並未特別說明,但看完內文後我的理解是:當我們將一個大函式內部依照其抽象概念劃分,分割成許多小函式時,它們通常時候會有其必要的執行順序,而這樣的情形,便稱為時序耦合。而不隱藏時序耦合,有助於呼叫的次序變得清晰,避免多人協作時因其他人不清楚其中邏輯,而導致使用了錯誤的次序。

public class MoogDiver {
    Gradient gradient;
    List<Spline> splines;

    public void dive(String reason) {
        saturateGradient();
        reticulateSplines();
        diveForMoog(reason);
    }
    ...
}

在這個函示中,先填滿漸層(saturate the gradient),再讓線條成網狀(reticulate the splines),最後才能使 moog 潛入水中(dive for the moog),這個先後次序並不能隨意錯置。然而在上述的呼叫中並未表達出此種次序,而可能導致他人使用上的錯誤。

所以作者認為這樣是更好的安排:

public class MoogDiver {
    Gradient gradient;
    List<Spline> splines;

    public void dive(String reason) {
        Gradient gradient= saturateGradient();
        List<Spline> splines = reticulateSplines(gradient);
        diveForMoog(splines, reason);
    }
    ...
}

如此一來,因為所傳入的參數都需先來自於上一個的運算結果,而曝露出時序的耦合性,並且解決次序錯置的問題。但在這個例子中我們可以注意到一個情形:由於作者將原本的方法都增加了一個參數,降低了函式本身的可閱讀性。我猜測是因為相較於次序錯置導致程式運行時拋出錯誤,稍微降低可閱讀性是比較可行的做法,也就是程式「可正確運行」這件事,優先級是高於「可閱讀性」的。


上一篇
異味(五):缺乏解釋性的變數、不精確
下一篇
異味(七):傳遞性導覽、違背慣例
系列文
重新開始學程式,【無瑕的程式碼:敏捷軟體開發技巧守則】共讀30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言